package org.springcloud.plugin.common.entity;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @Author yanggld
 * @Date 2019/12/17-16:55
 * @Description
 * 版本/区域 权重过滤规则
 */
@EqualsAndHashCode
@ToString
@Data
public class WeightFilterEntity implements Serializable {

	/**
	 *  Consumer-service-name非空，作为Key，以Map方式存储
	 *  对应如下情况：
	 *  表示消费端服务b访问提供端服务c的时候，提供端服务c的1.0版本提供90%的权重流量，1.1版本提供10%的权重流量
	 *  <service consumer-service-name="discovery-springcloud-example-b" provider-service-name="discovery-springcloud-example-c" provider-weight-value="1.0=90;1.1=10" type="version"/>
	 */
	private Map<String, List<WeightEntity>> versionWeightEntityMap;
	/**
	 * Consumer-service-name为空，以List方式存储
	 * 对应如下情况：
	 * 表示所有消费端服务访问提供端服务c的时候，提供端服务c的1.0版本提供90%的权重流量，1.1版本提供10%的权重流量
	 * <service provider-service-name="discovery-springcloud-example-c" provider-weight-value="1.0=90;1.1=10" type="version"/>
	 */
	private List<WeightEntity> versionWeightEntityList;
	/**
	 * 全局版本权重配置
	 * 对应如下情况：
	 * 表示所有版本为1.0的服务提供90%的权重流量，版本为1.1的服务提供10%的权重流量
	 * <version provider-weight-value="1.0=90;1.1=10"/>
	 */
	private VersionWeightEntity versionWeightEntity;

	/**
	 * Consumer-service-name非空，作为Key，以Map方式存储
	 * 对应如下情况：
	 * 表示消费端服务b访问提供端服务c的时候，提供端服务c的dev区域提供85%的权重流量，qa区域提供15%的权重流量
	 *  <service consumer-service-name="discovery-springcloud-example-b" provider-service-name="discovery-springcloud-example-c" provider-weight-value="dev=85;qa=15" type="region"/>
	 */
	private Map<String, List<WeightEntity>> regionWeightEntityMap;
	/**
	 * Consumer-service-name为空，以List方式存储
	 * 对应如下情况：
	 * 表示所有消费端服务访问提供端服务c的时候，提供端服务c的dev区域提供85%的权重流量，qa区域提供15%的权重流量
	 * <service provider-service-name="discovery-springcloud-example-c" provider-weight-value="dev=85;qa=15" type="region"/>
	 */
	private List<WeightEntity> regionWeightEntityList;
	/**
	 * 全局区域权重配置
	 * 对应如下情况：
	 * 表示所有区域为dev的服务提供85%的权重流量，区域为qa的服务提供15%的权重流量
	 *  <region provider-weight-value="dev=85;qa=15"/>
	 */
	private RegionWeightEntity regionWeightEntity;

	public boolean hasWeight() {
		return MapUtils.isNotEmpty(versionWeightEntityMap) || CollectionUtils.isNotEmpty(versionWeightEntityList) || versionWeightEntity != null ||
				MapUtils.isNotEmpty(regionWeightEntityMap) || CollectionUtils.isNotEmpty(regionWeightEntityList) || regionWeightEntity != null;
	}

}
